// 处理字符串相关的操作
var stringUtils = {
  /* @section 变量命名转化系列 */
  
  // 下划线命名转小驼峰命名
  snakeToCamel (name) {
    var nameArr = name.split('_')
    var len = nameArr.length
    var result = ''
    for (var i = 0; i < len; i++) {
      // 小驼峰命名法首字母不大写
      if (i == 0) {
        var section = nameArr[i]
      }
      else {
        var section = nameArr[i].substring(0, 1).toUpperCase() + nameArr[i].substring(1)
      }
      result = result + section
    }
    return result
  },
  
  // 将小驼峰命名的变量名转化为SQL的下划线命名的变量名
  camelToSnake (name) {
    return name.replace(/([A-Z])/g,"_$1").toLowerCase();
  },
  
  // 获取文件后缀名，后缀字符串包括点
  getFileTail (fileName) {
    var index = fileName.lastIndexOf('.')
    if (index >= 0) {
      return fileName.slice(index)
    }
    return ''
  },
  
  /*
    对于一个数字,如果位数达不到要求,在前面补0
    @prop num {String/Number} - 给定数字
    @prop limit {Number} [2] - 要求的长度
    @return {String} - 处理规范后的数字字符串
  */
  numString (num, limit = 2) {
    var result = num
    if (typeof result == 'number') {
      result = result.toString()
    }
    var delta = limit - result.length
    // 数字的长度达不到规定长度,在前面补0
    if (delta > 0) {
      for (var i = 0; i < delta; i++) {
        result = '0' + result
      }
    }
    
    return result + ''
  },
  
  // 检查字符串是不是数字字符串
  isNumberString (val) {
    if (typeof(val) === 'object' || !val) {
      return false
    }
    else {
      return !Number.isNaN(Number(val))
    }
  },
  
  // 以字母和数字生成随机字符串
  randomWordString (num) {
    var str = ''
    var arr = ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9',
      'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l',
      'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x',
      'y', 'z', 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J',
      'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V',
      'W', 'X', 'Y', 'Z']

    // 随机产生
    for (var i = 0; i < num; i++){
      var pos = Math.round(Math.random() * (arr.length - 1))
      str = str + arr[pos];
    }
    return str
  },
  
  /*
    大括号模板字符串解析.类似PHP中的字符串模板
    识别model字符串中被大括号包裹的key,用caller[key]进行替换.
    @prop model {String} - 模板字符串
    @prop caller {Object} - 替换对象
  */
  braceModel (model, caller) {
    // 正则表达式，将大括号组合提取出来
    var regExp = /\{\s*(.*?)\s*\}/g
    var resArr = model.match(regExp)
    if (!resArr) {
      return model
    }
    
    var res = model
    
    // 正则表达式，匹配开头括号和结尾括号以及中间内容两侧的空白
    var regExpContent = /(\{\s*)|(\s*\})/g
    var len = resArr.length
    for (var i = 0; i < len; i++) {
      // 提取中间的key
      var tempStr = resArr[i].replace(regExpContent, '')
      // console.log(tempStr)
      // 用.分割，获取每一层key
      var callerSearcherArr = tempStr.split('.')
      // 循环获取值，
      var replaceObj = caller
      var searcherLen = callerSearcherArr.length
      for (var j = 0; j < searcherLen; j++) {
        if (typeof replaceObj != 'undefined') {
          replaceObj = replaceObj[callerSearcherArr[j]]
        }
      }
      replaceObj = replaceObj.toString()
      res = res.replace(resArr[i], replaceObj)
    }
    
    return res  
  },
  
  // 对于一个路径,获取文件名
  getNameFromFilePath (path) {
    const arr = path.split('/')
    const len = arr.length
    return arr[len - 1]
  },
  
  // 获取父路径
  getParantPath (path) {
    let arr = path.split('/')
    const len = arr.length
    arr.splice(len - 1, 1)
    return arr.join('/') + '/'
  },
  
  // 文件名去除后缀
  cutFileTail (name) {
    let arr = name.split('.')
    arr.splice(arr.length - 1, 1)
    return arr.join('.')
  },
  
  // 获取后缀
  getFileTail (name) {
    let arr = name.split('.')
    return arr[arr.length - 1]
  },
}


export default stringUtils